微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

node.js – 一个包含多个package.json文件的项目

我对现代JS开发相对较新,我需要有关这种情况的帮助或建议.

情况:我们有一个支持IE8的React-Typescript-Redux项目(React 0.14).现在我们升级到IE11和React 16,但应该支持IE8.

要求:通过为每个构建使用不同的包和/或配置文件,减少浏览器版本之间的项目维护.

问题:从目前为止的研究来看,似乎无法在选定工具的同一项目中使用不同的package.json文件和node_modules文件夹:npm,Webpack,React,Redux,Typescript. Yarn似乎支持多个package.json文件,但我们希望尽可能避免从npm迁移.

目前的项目结构:

project_root/
  node_modules/
  src/
    components/
    utils/
    index.tsx
    components.css
  index.html
  package.json
  tsconfig.json
  webpack.config.json

我认为可能工作的是引入IE8子文件夹及其package.json和node_modules文件夹,然后以某种方式引用该构建任务的文件夹,但现在我忘记了如何告诉npm在构建时引用它.

拟议的项目结构:

project_root/
  ie8/
   node_modules/
   package.json
  node_modules/
  src/
    components/
    utils/
    index.tsx
    components.css
  index.html
  package.json
  tsconfig.json
  webpack.config.json

我在网上尝试了不同的东西,包括resolve.modules:[_ _ dirname“/ ie8 / node_modules”]但似乎它不起作用或我误解了它的作用,因为我得到了无法在几个文件中找到名称’require’错误在2.3.4中,在终端输出中引用了Typescript 2.8.3.没有它,项目构建与IE11的配置.

那么,任何人都可以肯定地告诉我它不可能或提供一些指导吗? This是我到目前为止找到的最接近的答案,但听起来不是最终的.或者,可以像这样支持项目结构或将项目分成两个是最好的选择吗?

提前致谢.

解决方法

好吧,经过一些更多的研究后我偶然发现了 Lerna,它主要允许我做我想做的事情(从我到目前为止看到的).它需要特定的项目树设置,如下所示:    

project_root/
  node_modules/
  packages/
    components/ // Components shared between projects
      components/
       MyComponent.jsx
      index.jsx

  legacy/
     output/
      build.js // React 0.14 build
     node_modules/
     package.json // project specific dependencies
     index.jsx // project specific entry
     .babelrc

  modern/
     output/
      build.js // React 16 build
     node_modules/
     package.json // project specific dependencies
     index.jsx // project specific entry
     .babelrc

  package.json // contains devDependencies shared between projects
  lerna.json
  webpack.config.js
  index.html

然后,在components / index.jsx中,我根据全局变量指定了不同版本的require命令:

if(PROJECT_SRC == legacy){
    React = require('../legacy/node_modules/react');
    ReactDOM = require('../legacy/node_modules/react-dom');
} else {
    React = require('../modern/node_modules/react');
    ReactDOM = require('../modern/node_modules/react-dom');
}

注意:这可能是不好的做法,但目前唯一的方法是我可以在构建中包含不同的React版本.在整个项目更改为此模型后,我将不得不看到此方法出现了什么问题.

在webpack.config.js中,我配置了两个导出 – 一个用于现代导出,一个用于遗留导出.每个指向不同的条目index.jsx文件,使用webpack.DefinePlugin将全局变量设置为“legacy”或“modern”,并指定要解析的公共组件模块的路径:[‘node_modules’,path.resolve(__ dirname,’组件’)]

单个项目输出的webpack.config看起来像这样:

{
        entry: ./packages/legacy/index.jsx,target: web,output: 
        {
            filename: build.js,path: __dirname + /packages/legacy/dist/,libraryTarget: var,library: lib_name
        },devtool: source-map,resolve: {
            extensions: [.js,.jsx,.json],modules: ['node_modules',path.resolve(__dirname,'components')]
        },plugins: plugins_legacy,module: {
            loaders: [
                {
                    test: /\.jsx?$/,loader: babel-loader,exclude: /node_modules/
                }
            ]
        }  
    }

随意评论或指出问题,但我希望这将有助于未来的人!

原文地址:https://www.jb51.cc/nodejs/241041.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐