我正在尝试关注http://gregblogs.com/how-django-reactjs-and-browserify/。我经历了一些麻烦才能开始collectstatic
工作,但现在它运行没有错误。但是,当我尝试加载包含我的 react 组件的页面时,另一个编译过程会启动(我认为 collectstatic 将预处理所有内容,并且不需要编译运行时)。它需要一些技巧才能使其立即工作(https://github.com/j0hnsmith/django-pipeline-browserify/issues/14)。但即使在那个补丁之后,不幸的是这个编译错误。虽然命令现在看起来没问题:如果我执行
C:\Users\JohnSmith\node_modules\.bin\browserify.cmd -t babelify --deps C:\Users\JohnSmith\Documents\test\company\static\dashboard\js\react_test_dashboard_widget.browserify.js
它运行没有错误并生成依赖项 JSON。当 Django/Pipeline 将相同的命令作为子进程执行时,它会出错说
Error: Cannot find module ' babelify' from 'C:\Users\JohnSmith\Documents\test\company
如何克服它?
packages.json 片段
"dependencies": {
"babel-cli": "^6.6.5",
"babel-preset-es2015": "^6.6.0",
"yuglify": "^0.1.4",
"babelify": "^7.3.0",
"browserify": "^13.0.1",
"jquery": "^2.2.0",
"react": "^15.2.0"
},
"devDependencies": {
"babel-plugin-transform-class-properties": "^6.10.2",
"babel-plugin-transform-react-jsx": "^6.8.0",
"babel-preset-es2016": "^6.11.0",
"babel-preset-react": "^6.11.1"
}
需求片段:
...
django-pipeline==1.6.6
django-pipeline-browserify==0.4.1
futures==3.0.5
...
一些设置(顺便说一句https://github.com/j0hnsmith/django-pipeline-browserify/issues/15):
PIPELINE["CSS_COMPRESSOR"] = "pipeline.compressors.NoopCompressor"
PIPELINE["JS_COMPRESSOR"] = "pipeline.compressors.NoopCompressor"
PIPELINE['SASS_BINARY'] = 'C:\\Ruby22-x64\\bin\\sass.bat'
PIPELINE['BABEL_BINARY'] = 'c:\\Users\\JohnSmith\\node_modules\\.bin\\babel.cmd'
PIPELINE['BROWSERIFY_BINARY'] = 'c:\\Users\\JohnSmith\\node_modules\\.bin\\browserify.cmd'
PIPELINE_BROWSERIFY_BINARY = PIPELINE['BROWSERIFY_BINARY']
if DEBUG:
PIPELINE["BROWSERIFY_ARGUMENTS"] = '-t babelify'
PIPELINE_BROWSERIFY_ARGUMENTS = PIPELINE["BROWSERIFY_ARGUMENTS"]
(编译器需要最后一个!)我的系统:Win 10、Python 2.7、Django 1.8
告诉我我还应该指定什么
更新:错误消息来自节点本身。请参阅下面的调用堆栈。请注意,这里我尝试显式指定转换 JS 文件而不是模块名称(这在命令行中也很有效,但在应用程序中效果不佳):
CompilerError: ['c:\\Users\\JohnSmith\\node_modules\\.bin\\browserify.cmd', '-t c:\\Users\\JohnSmith\\Documents\\test\\node_modules\\babelify\\index.js', u'--deps C:\\Users\\JohnSmith\\Documents\\test\\company\\static\\dashboard\\js\\react_test_dashboard_widget.browserify.js'] exit code 1
Error: Cannot find module ' c:\Users\JohnSmith\Documents\test\node_modules\babelify\index.js' from 'C:\Users\JohnSmith\Documents\test\company'
at c:\Users\JohnSmith\node_modules\resolve\lib\async.js:46:17
at process (c:\Users\JohnSmith\node_modules\resolve\lib\async.js:173:43)
at ondir (c:\Users\JohnSmith\node_modules\resolve\lib\async.js:188:17)
at load (c:\Users\JohnSmith\node_modules\resolve\lib\async.js:69:43)
at onex (c:\Users\JohnSmith\node_modules\resolve\lib\async.js:92:31)
at c:\Users\JohnSmith\node_modules\resolve\lib\async.js:22:47
at FSReqWrap.oncomplete (fs.js:82:15)
这告诉我,问题可能在于 Node 本身捕获了t
参数并且没有将其传递给browserify
. 肯定这个问题可能是至关重要的:https ://github.com/j0hnsmith/django-pipeline-browserify/issues/14
command = "%s %s %s --deps %s" % (
getattr(settings, 'PIPELINE_BROWSERIFY_VARS', ''),
getattr(settings, 'PIPELINE_BROWSERIFY_BINARY', '/usr/bin/env browserify'),
getattr(settings, 'PIPELINE_BROWSERIFY_ARGUMENTS', ''),
self.storage.path(infile),
)
和
command = (
getattr(settings, 'PIPELINE_BROWSERIFY_BINARY', '/usr/bin/env browserify'),
getattr(settings, 'PIPELINE_BROWSERIFY_ARGUMENTS', ''),
"--deps %s" % self.storage.path(infile),
)
因为管道编译器代码需要元组。通过他的原始代码,它收到一个完整的字符串,但随后将其分解为单个字符,认为所有这些都是参数,请参阅https://github.com/jazzband/django-pipeline/blob/master/pipeline/compilers/初始化.py#L108
argument_list = []
for flattening_arg in command:
if isinstance(flattening_arg, string_types):
argument_list.append(flattening_arg)
else:
argument_list.extend(flattening_arg)
这将导致后来的灾难:
CompilerError: [Error 87] The parameter is incorrect